home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-09-16 | 38.6 KB | 1,011 lines | [TEXT/CCL2] |
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; menu-editor.lisp
- ;;
- ;;
- ;; ©1989-1991 Apple Computer, Inc
- ;;
- ;; the menu editor portion of the interface designer
- ;;
-
-
-
- ;;;;;;;;;;;;;;;;;
- ;;
- ;; Change history
- ;;
- ;; 04/28/93 mwp Release
- ;; 11/03/92 bill pseudo-edit-menu-dialog now looks like a windoid, not a :document window.
- ;; ------------- 2.0
- ;; 03/23/92 bill function-definition now quotes symbols.
- ;; 03/19/92 bill function-definition makes a 0-arg function if it can't find source
- ;; ------------- 2.0f3
- ;; 11/11/91 alice nuke nfunction
- ;; 11/06/91 bill *restore-lisp-functions* -> def-load-pointers
- ;; 07/26/91 bill make editing titles active
- ;; 01/15/91 bill (method object-source-code (apple-menu)) had leftover object-lisp
- ;; 08/03/90 bill :parent -> :class
- ;;
-
-
- ;;;;;;;;;;;;;;;;;
- ;;
- ;; packages and symbols and classes
- ;;
-
- (in-package :interface-tools)
-
- (defvar *menu-scrap* nil)
- (defparameter *menu-arrow-bitmap* nil)
-
- (defclass menubar-editor (non-editable-dialog)
- ((current-menu :initform nil :accessor menubar-editor-menu))
- (:default-initargs
- :window-type :document
- :window-title "Menubar Editor"
- :view-position #@(6 59)
- :view-size #@(345 171)))
-
- (defclass menu-editor (non-editable-dialog)
- ((current-item :initform nil :accessor menu-editor-current-item)
- (edited-menu :initform nil :initarg :menu :accessor menu-editor-edited-menu))
- (:default-initargs
- :view-position #@(186 60)
- :window-type :document
- :view-size #@(342 233)
- :window-show nil))
-
- (defclass editable-table (sequence-dialog-item)
- ((my-text-editor :initform nil :accessor editable-table-text-editor)
- (edit-text-offset :allocation :class :accessor edit-text-offset)))
-
- (defclass menubar-editable-table (editable-table)
- ((edit-text-offset :allocation :class :initform #@(2 1)))
- (:default-initargs
- :table-print-function #'(lambda (object stream)
- (format stream (menu-title object)))))
-
- (defclass menu-editable-table (editable-table)
- ((edit-text-offset :allocation :class :initform #@(12 1))))
-
- (defclass table-text-edit (editable-text-dialog-item)
- ((current-cell :initform nil :accessor table-text-edit-current-cell)
- (my-table :initarg :table :initform nil :accessor table-text-edit-table)
- (my-offset :initarg :offset :initform #@(2 1) :accessor table-text-edit-offset)
- (full-size :initarg :full-size :accessor table-text-edit-full-size)
- (small-size :initarg :small-size :accessor table-text-edit-small-size))
- (:default-initargs
- :draw-outline nil
- :dialog-item-text ""
- :allow-returns t
- :view-position #@(0 0)
- :view-nick-name :table-text-edit))
-
- (defclass pseudo-edit-menu-dialog (windoid non-editable-dialog)
- ()
- (:default-initargs
- :window-title "Edit"
- :view-size #@(133 87)))
-
- (defclass add-menu-item-menu-item (menu-item)
- ((my-class-choice :initarg :class-choice :initform nil :accessor add-menu-item-class-choice)))
-
- (defvar *menubar-list* ())
- (defvar %current-menubar-editor nil)
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; patches for menubars, menus and menu-items
- ;;
-
- (defmethod set-part-color :around ((menubar menubar) part new-color)
- (declare (ignore new-color))
- (call-next-method)
- (when (eq part :default-menu-title)
- (update-menubar-editor)))
-
- (defmethod set-part-color :around ((menu menu) part new-color)
- (declare (ignore part))
- (call-next-method)
- (let* ((editor %current-menubar-editor)
- (pos (position menu (menubar))))
- (when (and editor pos)
- (set-part-color (view-named 'my-table editor)
- (make-point 0 pos)
- new-color))))
-
- (defvar *menu-editor-hash* (make-hash-table :test 'eq :weak t))
-
- (defun get-menu-editor (menu)
- (gethash menu *menu-editor-hash*))
-
- (defun (setf get-menu-editor) (editor menu)
- (if editor
- (setf (gethash menu *menu-editor-hash*) editor)
- (remhash menu *menu-editor-hash*)))
-
- ;;*** this is pessimal, but it works
- (defmethod set-part-color :around ((menu-item menu-item) part new-color)
- (call-next-method)
- (let* ((owner (menu-item-owner menu-item))
- (editor (and owner (get-menu-editor owner))))
- (when (and editor
- (or (eq part :item-title)
- (eq part :item-key)))
- (let* ((pos (make-point 0
- (position menu-item (menu-items owner)))))
- (when (eq part :item-title)
- (set-part-color (view-named 'my-menu-table editor) pos new-color))
- (update-items-for-new-selection editor pos)))))
-
- ;;;;;;;;;;;;;;;;
- ;;
- ;; global sets of menubars
- ;;
-
- (defun init-menubar-list (&rest menubars)
- (setq *menubar-list* (rplacd (last menubars) menubars)))
-
- (defun make-spec-from-menubar ()
- (cons (menu-items *apple-menu*)
- (cdr (menubar))))
-
- (progn
- (init-menubar-list (make-spec-from-menubar))
- nil)
-
- (defun rotate-menubars ()
- (update-list-from-menubar)
- (setq *menubar-list* (cdr *menubar-list*))
- (update-menubar-from-list))
-
- (defun add-menubar ()
- (push nil (cdr *menubar-list*))
- (rotate-menubars))
-
- (defun delete-menubar ()
- (setq *menubar-list* (carless-circle *menubar-list*))
- (update-menubar-from-list))
-
- (defun carless-circle (c-list)
- (let ((start c-list))
- (until (eq (cdr c-list)
- start)
- (setq c-list (cdr c-list)))
- (setf (cdr c-list)
- (cddr c-list))))
-
- (defun update-menubar-from-list ()
- (let* ((menubar-spec (car *menubar-list*))
- (apple-items (car menubar-spec))
- (rest-menus (cdr menubar-spec))
- (a-menu *apple-menu*)
- (*menubar-frozen* t))
- (update-list-from-menubar)
- (set-menubar nil)
- (apply #'remove-menu-items a-menu (menu-items a-menu))
- (apply #'add-menu-items a-menu apple-items)
- (set-menubar rest-menus)
- (update-menubar-editor)
- (#_drawmenubar)))
-
- (defun update-list-from-menubar ()
- (setf (car *menubar-list*) (make-spec-from-menubar)))
-
- (defun update-menubar-editor ()
- (let ((the-win %current-menubar-editor))
- (when the-win
- (set-table-sequence (view-named 'my-table the-win) (menubar)))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; used for indicating a heirarchical menu
- ;;
-
- (def-load-pointers init-menu-arrow-bitmap ()
- (let ((pointer (#_NewPtr :errchk 36)))
- (%put-ptr pointer (%inc-ptr pointer 14)) ;BaseAddr
- (%put-word pointer 2 4) ;rowbytes
- (%put-long pointer #@(0 0) 6) ;rectangle topleft
- (%put-long pointer #@(16 11) 10) ;rectangle bottomright
- (%put-word pointer #b1000000000000000 14)
- (%put-word pointer #b1100000000000000 16)
- (%put-word pointer #b1110000000000000 18)
- (%put-word pointer #b1111000000000000 20)
- (%put-word pointer #b1111100000000000 22)
- (%put-word pointer #b1111110000000000 24)
- (%put-word pointer #b1111100000000000 26)
- (%put-word pointer #b1111000000000000 28)
- (%put-word pointer #b1110000000000000 30)
- (%put-word pointer #b1100000000000000 32)
- (%put-word pointer #b1000000000000000 34)
- (setq *menu-arrow-bitmap* pointer)))
-
- ;;;;;;;;;;;;;;;;;
- ;;; *table-text-edit*
- ;;
- ;; this is the editable-text item which appears on top of a table
- ;; to give the illusion of editing an element in a table
-
- (defmethod initialize-instance ((item table-text-edit) &key table)
- (unless (typep table 'editable-table)
- (error "A :table of type ~s must be passed to initialize-instance for ~s"
- 'editable-table 'table-text-edit))
- (call-next-method)
- (let ((size (view-size item)))
- (setf (table-text-edit-full-size item) size)
- (setf (table-text-edit-small-size item) (subtract-points size #@(23 0)))))
-
- (defmethod view-draw-contents ((item table-text-edit))
- (call-next-method)
- (let* ((pos (view-position item))
- (size (add-points pos (view-size item))))
- (rlet ((rect :rect
- :topleft pos
- :bottomright size))
- (#_InsetRect :ptr rect :long #@(-1 -1))
- (#_FrameRect :ptr rect))))
-
- (defmethod view-corners ((item table-text-edit))
- (multiple-value-call #'inset-corners #@(-1 -1) (call-next-method)))
-
- (defmethod select-all ((item table-text-edit))
- (set-selection-range item 0 (buffer-size (fred-buffer item))))
-
- (defmethod update-position ((item table-text-edit) &optional dont-set-current)
- (let* ((table (table-text-edit-table item))
- (table-bottom (point-v (add-points (view-position table) (view-size table))))
- (cell (table-text-edit-current-cell item))
- (cell-height (and cell (point-v (cell-size table))))
- (position (and cell (cell-position table cell)))
- (window (view-window table)))
- (if (and position (<= (+ (point-v position) cell-height) table-bottom))
- (let ((menu-item (cell-contents table cell)))
- (dialog-item-enable item)
- (set-view-size
- item
- (cond ((command-key menu-item)
- (table-text-edit-small-size item))
- ((typep menu-item 'menu)
- (subtract-points (table-text-edit-full-size item) #@(16 0)))
- (t (table-text-edit-full-size item))))
- (set-view-position item (add-points (table-text-edit-offset item) position))
- (set-view-container item window)
- (unless dont-set-current
- (set-current-key-handler window item)))
- (progn
- (set-view-container item nil)))))
-
- ;***also take color?
- (defmethod set-link ((item table-text-edit) cell)
- (setf (table-text-edit-current-cell item) cell)
- (when cell
- (let* (text color)
- (let ((table (table-text-edit-table item)))
- (setq text (get-cell-text table cell)
- color (part-color table cell)))
- (set-dialog-item-text item text)
- (set-part-color item :text color)))
- (let ((dialog (view-container (table-text-edit-table item))))
- (unless cell
- (update-items-for-new-selection dialog cell))
- (update-position item)
- (when cell
- (select-all item))
- (when cell
- (update-items-for-new-selection dialog cell))))
-
- (defmethod view-key-event-handler ((item table-text-edit) key)
- (let* ((cell (table-text-edit-current-cell item)))
- (when cell
- (if (eq key #\return)
- (return-key item)
- (flet ((modcnt (item)
- (and (typep item 'fred-dialog-item)
- (buffer-modcnt (fred-buffer item)))))
- (let* ((modcnt (modcnt item)))
- (call-next-method)
- (setf (view-get item 'update-cell)
- (or (null modcnt) (not (eql modcnt (modcnt item)))))))))))
-
- (defmethod key-handler-idle ((item table-text-edit) &optional dialog)
- (declare (ignore dialog))
- (when (view-get item 'update-cell)
- (setf (view-get item 'update-cell) nil)
- (update-cell (table-text-edit-table item)
- (table-text-edit-current-cell item)
- (dialog-item-text item)))
- (call-next-method))
-
- (defmethod return-key ((item table-text-edit))
- (let* ((cell (table-text-edit-current-cell item))
- (text (dialog-item-text item))
- (window (view-window item)))
- (update-cell (table-text-edit-table item) cell text)
- (set-link item nil)
- (when window (window-update-event-handler window))))
-
- (defmethod view-click-event-handler ((item table-text-edit) where)
- (declare (ignore where))
- (if (double-click-p)
- (let* ((cell (table-text-edit-current-cell item)))
- (and cell
- (setq cell (cell-contents (table-text-edit-table item) cell))
- (typep cell 'menu)
- (progn (return-key item)
- (make-instance 'menu-editor :menu cell))))
- (call-next-method)))
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;
- ;;;
- ;;; editable-table
- ;;
- ;; a table whose contents can be edited
- ;;
- ;; used as a parent-class for menubar-editable-table and menu-editable-table
- ;; subclasses must define get-cell-text, and update-cell
-
- (defmethod initialize-instance :after ((table editable-table) &key)
- (let* ((edit-text-offset (edit-text-offset table)))
- (setf (editable-table-text-editor table)
- (make-instance 'table-text-edit
- :view-size (subtract-points
- (cell-size table)
- (subtract-points edit-text-offset
- #@(-1 1)))
- :offset edit-text-offset
- :table table))))
-
- (defmethod view-click-event-handler ((table editable-table) where)
- (let ((text-editor (editable-table-text-editor table))
- (cell (point-to-cell table where))
- (window (view-window table)))
- (if cell
- (set-link text-editor cell)
- (progn
- (call-next-method)
- (update-position text-editor t)))
- (when (view-container text-editor)
- (view-focus-and-draw-contents text-editor)
- (validate-view text-editor))
- (window-update-event-handler window)))
-
- (defmethod set-table-sequence ((table editable-table) new-sequence)
- (let ((old-v (point-v (scroll-position table))))
- (without-interrupts
- (call-next-method)
- (when (and (<= old-v (length new-sequence))
- (neq old-v (point-v (scroll-position table))))
- (scroll-to-cell table 0 old-v))
- (let ((text-editor (editable-table-text-editor table)))
- (when text-editor
- (set-link text-editor nil))))))
-
- (defmethod set-part-color ((table editable-table) part new-color)
- (let ((text-editor (editable-table-text-editor table)))
- (when text-editor
- (when (eq part (table-text-edit-current-cell text-editor))
- (set-part-color text-editor :text new-color)))
- (call-next-method)))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;
- ;;; menubar-editable-table
- ;;
- ;; an editable table designed to display a menubar
- ;;
-
- (defmethod get-cell-text ((table menubar-editable-table) cell)
- (menu-title (cell-contents table cell)))
-
- (defmethod update-cell ((table menubar-editable-table) cell text)
- (set-menu-title (cell-contents table cell) text))
-
- (defmethod set-table-sequence ((table menubar-editable-table) new-sequence)
- (without-interrupts
- (call-next-method)
- (let ((default-color (part-color *menubar* :default-menu-title)))
- (do* ((menu (pop new-sequence) (pop new-sequence))
- (cell #@(0 0) (add-points cell #@(0 1))))
- ((not menu))
- (set-part-color table
- cell
- (or (part-color (cell-contents table cell) :menu-title)
- default-color))))))
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;
- ;;; menu-editable-table
- ;;
- ;; an editable table designed to display menus
- ;;
- (defmethod get-cell-text ((table menu-editable-table) cell)
- (menu-item-title (cell-contents table cell)))
-
- (defmethod update-cell ((table menu-editable-table) cell text)
- (set-menu-item-title (cell-contents table cell) text))
-
- (defmethod set-table-sequence ((table menu-editable-table) new-sequence)
- (without-interrupts
- (call-next-method)
- (do* ((item (pop new-sequence) (pop new-sequence))
- (cell #@(0 0) (add-points cell #@(0 1))))
- ((not item))
- (set-part-color table
- cell
- (part-color-with-default (cell-contents table cell) :menu-item-title)))))
-
- (defmethod draw-cell-contents ((table menu-editable-table) cell &optional v)
- (setq cell (make-point cell v))
- (let* ((item (cell-contents table cell))
- (cell-width (make-point (point-h (cell-size table)) 0)) ;should be hard-wired
- (wptr (wptr table))
- (init-pos (rref wptr :windowRecord.pnloc))
- mark title key
- mark-color title-color key-color)
- (setq mark (menu-item-check-mark item)
- title (menu-item-title item)
- key (or (command-key item) (typep item 'menu)))
- (when mark
- (setq mark-color (part-color-with-default item :item-mark)))
- (setq title-color (part-color-with-default item :item-title))
- (when key
- (setq key-color (part-color-with-default item :item-key)))
- ; (with-port wptr
- (when mark
- (with-fore-color mark-color
- (#_drawchar :word (char-code mark))))
- (#_moveto :long (add-points init-pos #@(10 0)))
- (with-fore-color title-color
- (with-pstrs ((title title))
- (#_drawstring :ptr title)))
- (when key
- (setq cell-width (add-points cell-width init-pos))
- (with-fore-color key-color
- (if (eq key t)
- (progn
- (setq cell-width (subtract-points cell-width #@(12 10)))
- (rlet ((rect :rect :topleft cell-width
- :bottomright (add-points cell-width #@(16 11))))
- (#_CopyBits :ptr *menu-arrow-bitmap*
- :ptr (rref wptr windowRecord.portbits)
- :ptr (%inc-ptr *menu-arrow-bitmap* 6)
- :ptr rect
- :word 0
- :ptr (ccl::%null-ptr))))
- (progn
- (#_moveto :long (subtract-points cell-width #@(26 0)))
- (#_drawchar :word (char-code #\commandmark))
- (#_drawchar :word (char-code key))))))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; add-menu-item-menu-items
- ;;
-
- (defmethod initialize-instance :after ((item add-menu-item-menu-item) &key)
- (set-menu-item-title item (string-downcase (add-menu-item-class-choice item))))
-
- (defmethod menu-item-action ((item add-menu-item-menu-item))
- (let* ((*menu-scrap* (make-instance (add-menu-item-class-choice item)
- :menu-item-title "Untitled")))
- (declare (special *menu-scrap*))
- (paste (front-window))))
-
- (defvar *editable-menu-item-classes* ())
-
- (defun add-editable-menu-item (class-or-name)
- (let* ((class (if (symbolp class-or-name)
- (find-class class-or-name)
- class-or-name))
- (class-name (class-name class))
- (proto (class-prototype class)))
- (unless (or (typep proto 'menu-item)
- (typep proto 'menu))
- (error "~s does not name a subclass of menu or menu-item" class-or-name))
- (let ((classes *editable-menu-item-classes*))
- (unless (memq class-name classes)
- (setq *editable-menu-item-classes*
- (nconc classes (list class-name)))))))
-
- (add-editable-menu-item 'menu-item)
- (add-editable-menu-item 'menu)
- (add-editable-menu-item 'window-menu-item)
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; menubar editor
- ;;
-
- (defmethod update-items-for-new-selection ((editor menubar-editor) cell)
- (setf (menubar-editor-menu editor)
- (if cell
- (cell-contents (view-named 'my-table editor) cell))))
-
- (defmethod initialize-instance :after ((editor menubar-editor) &key menubar)
- (add-subviews
- editor
- (make-dialog-item 'menubar-editable-table
- #@(10 5) #@(150 133) "" nil
- :cell-size #@(134 16)
- :table-hscrollp nil
- :table-vscrollp t
- :table-sequence (or menubar (menubar))
- :view-nick-name 'my-table)
- (make-dialog-item 'button-dialog-item
- #@(9 145) #@(153 16) "Print Menubar Source"
- #'(lambda (item)
- (declare (ignore item))
- (let* ((*print-length* nil)
- (*print-level* nil)
- (*print-array* t)
- (*print-pretty* t)
- (win (make-instance 'fred-window))
- (menus (menubar)))
- (with-cursor *watch-cursor*
- (format win "~s"
- `(progn ,(object-source-code (pop menus))
- (set-menubar (list ,@(mapcar
- #'(lambda (menu)
- (object-source-code menu))
- menus)))))
- (fred-update win)))))
- (make-dialog-item 'button-dialog-item
- #@(178 11) #@(153 16) "Add Menu"
- #'(lambda (item)
- (insert-menu (make-instance 'menu :menu-title "Untitled")
- (menubar-editor-menu (view-container item)))
- (update-menubar-editor)))
- (make-dialog-item 'title-box-dialog-item
- #@(173 45) #@(164 117) "Menubar Operations" nil)
- (make-dialog-item 'button-dialog-item
- #@(177 60) #@(153 16) "Rotate Menubars"
- #'(lambda (item)
- (declare (ignore item))
- (rotate-menubars)))
- (make-dialog-item 'button-dialog-item
- #@(177 82) #@(153 16) "Add New Menubar"
- #'(lambda (item)
- (declare (ignore item))
- (add-menubar)))
- (make-dialog-item 'button-dialog-item
- #@(177 104) #@(153 16) "Delete Menubar"
- #'(lambda (item)
- (declare (ignore item))
- (delete-menubar)))
- (make-dialog-item 'color-part-pop-up
- #@(177 130) #@(147 21) "Menubar Colors" nil
- :colored-object *menubar*
- :part-codes '(:default-menu-title
- :default-menu-background
- :default-item-title
- :menubar))))
-
- (defmethod window-close :before ((editor menubar-editor))
- (map-windows #'(lambda (w) (window-close w)) :class 'pseudo-edit-menu-dialog)
- (setq %current-menubar-editor nil))
-
- (defun edit-menubar ()
- (let* ((old-ed %current-menubar-editor)
- (old-pseudo (car (windows :class 'pseudo-edit-menu-dialog
- :include-invisibles t
- :include-windoids t))))
- (if old-ed
- (window-select old-ed)
- (setq %current-menubar-editor
- (setq old-ed (make-instance 'menubar-editor :menubar (menubar)))))
- (if old-pseudo
- (window-select old-pseudo)
- (let ((old-ed-pos (view-position old-ed))
- (old-ed-width (point-h (view-size old-ed))))
- (setq old-pseudo
- (make-instance 'pseudo-edit-menu-dialog
- :view-position
- (add-points old-ed-pos
- (make-point (+ 10 old-ed-width)
- 0))))))))
-
- (defun insert-menu (menu after)
- (let ((menus (memq after (menubar)))
- (*menubar-frozen* t))
- (declare (special *menubar-frozen*))
- (dolist (1menu menus)
- (menu-deinstall 1menu))
- (menu-install menu)
- (dolist (1menu menus)
- (menu-install 1menu))
- (#_drawmenubar)))
-
- (defmethod cut ((editor menubar-editor))
- (let* ((menu (menubar-editor-menu editor)))
- (when menu
- (setq *menu-scrap* menu)
- (menu-deinstall menu)
- (update-menubar-editor))))
-
- (defmethod copy ((editor menubar-editor))
- (let* ((menu (menubar-editor-menu editor)))
- (when menu
- (setq *menu-scrap* (copy-instance menu)))))
-
- (defmethod paste ((editor menubar-editor))
- (let* ((new-menu *menu-scrap*)
- (before-menu (menubar-editor-menu editor)))
- (when (typep new-menu 'menu)
- (insert-menu new-menu before-menu)
- (update-menubar-editor))))
-
- (defmethod clear ((editor menubar-editor))
- (let* ((menu (menubar-editor-menu editor)))
- (when menu
- (menu-deinstall menu)
- (update-menubar-editor))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; menu-editor
- ;;
-
-
- (defmethod initialize-instance :after ((editor menu-editor) &key menu)
- (setf (get-menu-editor menu) editor)
- (set-window-title editor (concatenate 'string "\"" (menu-title menu) "\" Menu"))
- (add-subviews
- editor
- (make-dialog-item 'menu-editable-table
- #@(8 25) #@(155 179) "" nil
- :table-sequence (menu-items menu)
- :cell-size #@(139 16)
- :table-hscrollp nil
- :table-vscrollp t
- :view-nick-name 'my-menu-table)
- (make-dialog-item 'button-dialog-item
- #@(7 209) #@(158 16) "Print Menu Source"
- #'(lambda (item)
- (let ((container (view-container item)))
- (let* ((*print-length* nil)
- (*print-level* nil)
- (*print-array* t)
- (win (make-instance 'fred-window)))
- (pprint (object-source-code
- (menu-editor-edited-menu container))
- win)))))
- (make-dialog-item 'pop-up-menu
- #@(165 26) #@(160 20) "" nil
- :item-display "Add Menu Item"
- :menu-items
- (mapcar #'(lambda (class-sym)
- (make-instance 'add-menu-item-menu-item
- :class-choice class-sym))
- *editable-menu-item-classes*))
- (make-dialog-item 'check-box-dialog-item
- #@(172 89) #@(76 16) "Disabled"
- #'(lambda (item)
- (let* ((container (view-container item))
- (current-item (menu-editor-current-item container)))
- (when current-item
- (if (check-box-checked-p item)
- (menu-item-disable current-item)
- (menu-item-enable current-item)))))
- :view-nick-name 'my-disabled-check-box)
- (make-dialog-item 'one-char-box
- #@(277 70) #@(18 16) ""
- #'(lambda (item)
- (let* ((container (view-container item))
- (current-item (menu-editor-current-item container))
- (string (dialog-item-text item))
- (new-char (if (> (length string) 0)
- (char string 0)
- nil)))
- (when current-item
- (set-command-key current-item new-char)
- (invalidate-selected-table-cell container :right))))
- :view-nick-name 'my-char-box
- :allow-returns nil)
- (make-dialog-item 'check-box-dialog-item
- #@(172 109) #@(100 16) "Check Mark"
- #'(lambda (item)
- (let* ((container (view-container item))
- (current-item (menu-editor-current-item container)))
- (when current-item
- (set-menu-item-check-mark
- current-item (check-box-checked-p item))
- (invalidate-selected-table-cell container :left))))
- :view-nick-name 'my-checked-check-box)
- (make-dialog-item 'static-text-dialog-item
- #@(8 5) #@(89 16) "Menu Items:" nil)
- (make-dialog-item 'static-text-dialog-item
- #@(173 69) #@(100 16) "Command Key:" nil
- :view-nick-name 'my-command-item-title)
- (make-dialog-item 'button-dialog-item
- #@(173 132) #@(160 16) "Menu Item Action"
- #'(lambda (item)
- (let ((container (view-container item)))
- (new-action-from-dialog (menu-editor-current-item container))))
- :view-nick-name 'my-action-button)
- (make-dialog-item 'title-box-dialog-item
- #@(173 162) #@(162 63) "Colors" nil)
- (make-dialog-item 'color-part-pop-up
- #@(176 171) #@(155 19) "Menu Colors" nil
- :colored-object menu
- :part-codes '(:menu-title
- :menu-background
- :default-item-title))
- (make-dialog-item 'color-part-pop-up
- #@(176 196) #@(155 20) "Menu Item Colors" nil
- :view-nick-name 'my-item-color-menu
- :colored-object nil
- :part-codes '(:item-title
- :item-key
- :item-mark)))
- (update-items-for-new-selection editor nil)
- (window-show editor))
-
- (defmethod invalidate-selected-table-cell ((window menu-editor) &optional part)
- (let* ((table (view-named 'my-menu-table window))
- (editor (editable-table-text-editor table)))
- (when (view-container editor)
- (let* ((pos (view-position editor))
- (size (view-size editor))
- (left (point-h (view-position table)))
- (right (+ left (point-h (view-size table))))
- (top (point-v pos))
- (bottom (+ top (point-v size))))
- (cond ((null part))
- ((eq part :left)
- (setq right (- (point-h pos) 1)))
- ((eq part :right)
- (setq left (+ (point-h pos) (point-h size) 2))))
- (if (or (null part) (eq part :left))
- (update-position editor t))
- (invalidate-corners window (make-point left top) (make-point right bottom))))))
-
- (defmethod window-close :before ((editor menu-editor))
- (return-key editor)
- (setf (get-menu-editor (menu-editor-edited-menu editor)) nil))
-
- (defmethod return-key ((editor menu-editor))
- (let ((text-edit (editable-table-text-editor (view-named 'my-menu-table editor))))
- (when (and text-edit (view-container text-edit))
- (return-key text-edit))))
-
- (defmethod update-items-for-new-selection ((editor menu-editor) item)
- (let ((disabled-check-box (view-named 'my-disabled-check-box editor))
- (char-box (view-named 'my-char-box editor))
- (action-button (view-named 'my-action-button editor))
- (item-color-menu (view-named 'my-item-color-menu editor))
- (checked-box (view-named 'my-checked-check-box editor))
- (command-item-title (view-named 'my-command-item-title editor)))
- (if item
- (let* (enabled com-char com-char-color check-mark)
- (setq item (cell-contents (view-named 'my-menu-table editor) item))
- (setf (menu-editor-current-item editor) item)
- (setq enabled (menu-item-enabled-p item)
- com-char (command-key item)
- com-char-color (part-color-with-default item :item-key)
- check-mark (menu-item-check-mark item))
- (dialog-item-enable disabled-check-box)
- (if enabled
- (check-box-uncheck disabled-check-box)
- (check-box-check disabled-check-box))
- (dialog-item-enable char-box)
- (set-dialog-item-text char-box (if com-char
- (string com-char)
- ""))
- (set-part-color char-box :text com-char-color)
- (dialog-item-enable command-item-title)
- (if (typep item 'menu)
- (progn (dialog-item-disable action-button)
- (dialog-item-disable checked-box))
- (progn (dialog-item-enable action-button)
- (dialog-item-enable checked-box)))
- (dialog-item-enable item-color-menu)
- (set-colored-object item-color-menu item)
- (if check-mark
- (check-box-check checked-box)
- (check-box-uncheck checked-box)))
- (progn
- (setf (menu-editor-current-item editor) nil)
- (check-box-uncheck disabled-check-box)
- (dialog-item-disable disabled-check-box)
- (set-dialog-item-text char-box "")
- (dialog-item-disable char-box)
- (check-box-uncheck checked-box)
- (dialog-item-disable checked-box)
- (dialog-item-disable command-item-title)
- (dialog-item-disable action-button)
- (dialog-item-disable item-color-menu)))))
-
- (defmethod new-action-from-dialog ((item menu-item))
- (let ((*save-definitions* t))
- (setf (menu-item-action-function item)
- (eval (read-from-string
- (get-text-from-user
- "Please enter text for the menu-item-action:"
- (menu-item-action-source item)))))))
-
- (defmethod menu-item-action-source ((item menu-item) &aux old-fun)
- (let* ((*print-pretty* t))
- (format nil
- "(function ~a)"
- (let ((f (menu-item-action-function item)))
- (if f
- (or (and (setq old-fun (uncompile-function f))
- (format nil "~s" old-fun))
- "(lambda ()
- ;The previous source code for the action could not be found.
- ;Perhaps the code for the menu was loaded from a fasl file,
- ;or was compiled with *SAVE-DEFINITIONS* bound to nil
- )")
- "(lambda ()
- ;Enter action source code here.
- )")))))
-
- (defmethod new-action-from-dialog ((item window-menu-item))
- (let* ((old-action-symbol (menu-item-action-function item)))
- (setf (menu-item-action-function item)
- (read-from-string
- (get-string-from-user "Please enter the name of a window function to be called when this menu-item is selected."
- :initial-string (format nil "~s" old-action-symbol)
- :size #@(350 90))
- nil))))
-
-
- (defmethod cut ((editor menu-editor))
- (let* ((item (menu-editor-current-item editor))
- (menu (menu-editor-edited-menu editor)))
- (if item
- (progn
- (setq *menu-scrap* item)
- (remove-menu-items menu item)
- (set-table-sequence (view-named 'my-menu-table editor) (menu-items menu)))
- (progn
- (ed-beep)
- (message-dialog "There is no selected menu-item to cut.")))))
-
- (defmethod copy ((editor menu-editor))
- (let* ((item (menu-editor-current-item editor)))
- (if item
- (setq *menu-scrap* (copy-instance item))
- (progn
- (ed-beep)
- (message-dialog "There is no selected menu-item to copy.")))))
-
- (defmethod paste ((editor menu-editor))
- (let* ((item *menu-scrap*)
- (menu (menu-editor-edited-menu editor))
- (before-item (menu-editor-current-item editor)))
- (cond ((not item)
- (ed-beep)
- (message-dialog "No menu-item has been copied or cut."))
- (t
- ;(print-db 1)
- (insert-menu-item menu item before-item)
- ;(print-db 2)
- (set-table-sequence (view-named 'my-menu-table editor) (menu-items menu))
- ;(print-db 3)
- (setq *menu-scrap* (copy-instance item))
- ;(print-db 4)
- ))))
-
-
- (defmethod insert-menu-item ((menu menu) item before-what)
- (let ((m-items (memq before-what (menu-items menu))))
- (apply #'remove-menu-items menu m-items)
- (apply #'add-menu-items menu item m-items)))
-
- (defmethod clear ((editor menu-editor))
- (let* ((item (menu-editor-current-item editor))
- (menu (menu-editor-edited-menu editor)))
- (if item
- (progn
- (remove-menu-items menu item)
- (set-table-sequence (view-named 'my-menu-table editor) (menu-items menu)))
- (progn
- (ed-beep)
- (message-dialog "There is no selected menu-item to clear.")))))
-
-
- ;;;;;;;;;;;;;;;;;;;
- ;;
- ;; cut/copy/paste/clear dialog
- ;;
-
- (defmethod initialize-instance :after ((dialog pseudo-edit-menu-dialog) &key)
- (add-subviews
- dialog
- (make-dialog-item 'button-dialog-item
- #@(4 4) #@(125 16) "Cut"
- #'(lambda (item)
- (declare (ignore item))
- (cut (front-window))))
- (make-dialog-item 'button-dialog-item
- #@(4 25) #@(125 16) "Copy"
- #'(lambda (item)
- (declare (ignore item))
- (copy (front-window))))
- (make-dialog-item 'button-dialog-item
- #@(4 45) #@(125 16) "Paste"
- #'(lambda (item)
- (declare (ignore item))
- (paste (front-window))))
- (make-dialog-item 'button-dialog-item
- #@(4 66) #@(125 16) "Clear"
- #'(lambda (item)
- (declare (ignore item))
- (clear (front-window))))))
-
-
-
- ;;;;;;;;;;;;;;;;;;;;
- ;;
- ;; source code printing for menus and menu-items
- ;;
-
- (defmethod object-source-code ((menu menu))
- (let* ((source (and (next-method-p) (call-next-method))) ;pop-up-menus use dialog-item version
- (colors (part-color-list menu))
- (items `(list ,@(mapcar #'(lambda (item)
- (object-source-code item))
- (menu-items menu)))))
- (if source
- (nconc source
- `(:menu-items ,items
- ,@(if colors
- `(:menu-colors ',colors))))
- `(make-instance ',(class-name (class-of menu))
- :menu-title ,(menu-title menu)
- ,@(if colors
- `(:menu-colors ',colors))
- :menu-items ,items))))
-
- (defmethod object-source-code ((menu apple-menu))
- `(let ((apple-menu *apple-menu*))
- (apply #'remove-menu-items apple-menu (menu-items apple-menu))
- (apply #'add-menu-items
- apple-menu
- (list ,@(mapcar #'(lambda (item)
- (object-source-code item))
- (menu-items menu))))))
-
- (defun function-definition (f)
- (cond ((null f) nil)
- ((symbolp f) `',f)
- ((functionp f)
- (let ((name (function-name f)))
- (if (and (symbolp name) (fboundp name) (eq f (symbol-function name)))
- `',name
- (let ((def (uncompile-function f)))
- (if def
- `(function ,def)
- '(function (lambda () "Can't find definition")))))))))
-
- (defmethod object-source-code ((item menu-item) &aux value)
- `(make-instance ',(class-name (class-of item))
- :menu-item-title ,(menu-item-title item)
- ,@(if (setq value (part-color-list item))
- `(:menu-item-colors ',value))
- ,@(if (setq value (function-definition (menu-item-action-function item)))
- `(:menu-item-action ,value))
- ,@(if (menu-item-enabled-p item)
- ()
- `(:disabled t))
- ,@(if (setq value (command-key item))
- `(:command-key ,value)
- ())
- ,@(if (neq (setq value (menu-item-style item)) :plain)
- `(:menu-item-style ',value)
- ())
- ,@(if (setq value (menu-item-check-mark item))
- `(:menu-item-checked ,value)
- ())))
-
- (defmethod object-source-code ((item window-menu-item))
- (let* ((source (call-next-method))
- (f (function-definition (menu-item-action-function item))))
- (remf source :menu-item-action)
- (nconc source `(:menu-item-action ,f))))
-